#!/bin/bash

# release version
version=3.6.0

CWD=$(cd $(dirname $0)/; pwd)
cd $CWD

usage()
{
	echo $"Usage: $0 {start|stop|restart|status|build|build_local|pack} <module>"
	exit 0
}

start_all()
{
	test -x n9e-rdb && start rdb
	test -x n9e-job && start job
	test -x n9e-ams && start ams
	test -x n9e-monapi && start monapi
	test -x n9e-tsdb && start tsdb
	test -x n9e-index && start index
	test -x n9e-transfer && start transfer
	test -x n9e-judge && start judge
	test -x n9e-agent && start agent
	test -x n9e-prober && start prober
}

start()
{
	mod=$1
	if [ "x${mod}" = "x" ]; then
		usage
		return
	fi

	if [ "x${mod}" = "xall" ]; then
		start_all
		return
	fi

	binfile=n9e-${mod}

	if [ ! -f $binfile ]; then
		echo "file[$binfile] not found"
		exit 1
	fi

	if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -gt 0 ]; then
		echo "${mod} already started"
		return
	fi

	mkdir -p logs/$mod
	nohup $CWD/$binfile &> logs/${mod}/stdout.log &

	for((i=1;i<=15;i++)); do
		if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -gt 0 ]; then
			echo "${mod} started"
			return
		fi
		sleep 0.2
	done

	echo "cannot start ${mod}"
	exit 1
}

stop_all()
{
	test -x n9e-agent && stop agent
	test -x n9e-judge && stop judge
	test -x n9e-transfer && stop transfer
	test -x n9e-index && stop index
	test -x n9e-tsdb && stop tsdb
	test -x n9e-monapi && stop monapi
	test -x n9e-ams && stop ams
	test -x n9e-job && stop job
	test -x n9e-rdb && stop rdb
	test -x n9e-prober && stop prober
}

stop()
{
	mod=$1
	if [ "x${mod}" = "x" ]; then
		usage
		return
	fi

	if [ "x${mod}" = "xall" ]; then
		stop_all
		return
	fi

	binfile=n9e-${mod}

	if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -eq 0 ]; then
		echo "${mod} already stopped"
		return
	fi

	ps aux|grep -v grep|grep -v control|grep "$binfile"|awk '{print $2}'|xargs kill
	for((i=1;i<=15;i++)); do
		if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -eq 0 ]; then
			echo "${mod} stopped"
			return
		fi
		sleep 0.2
	done

	echo "cannot stop $mod"
	exit 1
}

restart()
{
	mod=$1
	if [ "x${mod}" = "x" ]; then
		usage
		return
	fi

	if [ "x${mod}" = "xall" ]; then
		stop_all
		start_all
		return
	fi

	stop $mod
	start $mod

	status
}

status()
{
	ps aux|grep -v grep|grep "n9e"
}

build_one()
{
	mod=$1
	echo -n "building ${mod} ... "
	go build -ldflags "-X main.version=${version}" -o n9e-${mod} src/modules/${mod}/${mod}.go
	echo "done"
}

build_local_one()
{
	mod=$1
	echo -n "building ${mod} ... "
	go build -mod=vendor -ldflags "-X main.version=${version}" -o n9e-${mod} src/modules/${mod}/${mod}.go
	echo "done"
}

build()
{
	export GO111MODULE=on

	mod=$1
	if [ "x${mod}" = "x" ]; then
		build_one monapi
		build_one transfer
		build_one index
		build_one judge
		build_one agent
		build_one tsdb
		build_one rdb
		build_one ams
		build_one job
		build_one prober
		return
	fi

	build_one $mod 
}

build_local()
{
	export GO111MODULE=on

	mod=$1
	if [ "x${mod}" = "x" ]; then
		build_local_one monapi
		build_local_one transfer
		build_local_one index
		build_local_one judge
		build_local_one agent
		build_local_one tsdb
		build_local_one rdb
		build_local_one ams
		build_local_one job
		build_local_one prober
		return
	fi

	build_local_one $mod
}

reload()
{
	mod=$1
	if [ "x${mod}" = "x" ]; then
		echo "arg: <mod> is necessary"
		return
	fi
	
	build_one $mod
	restart $mod
}

pack()
{
	clock=$(date +%s)
	mkdir -p ~/n9e.bak.$clock

	if ls etc/*.local.yml &>/dev/null; then
	  mv etc/*.local.yml ~/n9e.bak.$clock
	fi

	tar zcvf n9e-${version}.tar.gz script control sql etc n9e-*

	if ls ~/n9e.bak.$clock/*.local.yml &>/dev/null; then
	  mv  ~/n9e.bak.$clock/*.local.yml etc/
	fi

	rm -rf ~/n9e.bak.$clock
}

exec()
{

  params=${@:2}

  if [ ${#2} -gt 0 ]; then
    for param in $params
    do
      $1 $param
      if [ "x${mod}" = "xall" ]; then
        break
      fi
    done
  else
  echo $1
    $1
  fi
}

case "$1" in
	start)
		exec start ${@:2}
		;;
	stop)
		exec stop ${@:2}
		;;
	restart)
		exec restart ${@:2}
		;;
	status)
		status
		;;
	build)
		exec build ${@:2}
		;;
	build_local)
		exec build_local ${@:2}
		;;
	reload)
		exec reload ${@:2}
		;;
	pack)
		exec pack ${@:2}
		;;
	*)
		usage
esac
